home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2005 June (DVD) / DPPRO0605DVD.iso / Install / program files / Borland / BDS / 3.0 / Demos / Delphi.Net / CLR / Remoting / uNTService.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2004-10-22  |  5.0 KB  |  210 lines

  1. unit uNTService;
  2. //------------------------------------------------------------------------------
  3. //  Last updated:   11/06/03
  4. //  Author:         Dennis Passmore
  5. //  Company:        Ultimate Software, Inc.
  6. //  Contact info:   dennis_passmore@ultimatesoftware.com
  7. //
  8. //  Compatibility:  Delphi for .NET HTTP service demo
  9. //
  10. //  Description:    TNTKeyService class implements base .NET service class.
  11. //                  TLockserver class implements base ILockserver which is
  12. //                  exported via .NET Remoting
  13. //
  14. //------------------------------------------------------------------------------
  15. interface
  16.  
  17. // at the time of writing this example the optimizing compiler was not functional
  18. // and the only way to avoid code bloat was to copy specific RTL code into your
  19. // application. This should be corrected in the final release of Delphi 8 for .NET
  20.  
  21. {$define MinEXE} // to avoid code bloat caused by using Borland.Vcl.Classes
  22.  
  23. uses
  24.   System.IO,
  25.   System.ServiceProcess,
  26.   System.Runtime.Remoting,
  27.   Borland.Vcl.SysUtils,
  28.   uRNGintf;
  29.  
  30. type
  31.   TNTKeyService = class(System.ServiceProcess.ServiceBase)
  32.   strict protected
  33.     procedure OnContinue; override;
  34.     procedure OnPause; override;
  35.     procedure OnShutdown; override;
  36.     procedure OnStart(args: array of string); override;
  37.     procedure OnStop; override;
  38.   public
  39.     constructor Create;
  40.   end;
  41.  
  42.   TLockserver = class(MarshalByRefObject, ILockserver)
  43.     function ExtendLock(const fKey: widestring): boolean;
  44.     function Lockitem(const fItem: widestring; out fKey: widestring): boolean;
  45.     function IsItemLocked(const fItem: widestring): boolean;
  46.     function UnLockitem(const fKey: widestring): boolean;
  47.   end;
  48.  
  49.   [assembly: RuntimeRequiredAttribute(TypeOf(TLockserver))]
  50.  
  51. var
  52.   NTKeyService: TNTKeyService = nil;
  53.   RNG: TLockserver = nil;
  54.  
  55. implementation
  56.  
  57. uses
  58. {$ifdef MinEXE} // to avoid code bloat caused by using Borland.Vcl.Classes
  59.   uTListImpl,
  60. {$else}
  61.   Borland.Vcl.Classes,
  62. {$endif}
  63.   uInstService;
  64.  
  65. const
  66.   FiveMin: double = 5 * 60 / 84600;
  67.  
  68. type
  69.   TLockItem = class
  70.     fItem: string;
  71.     fKey: string;
  72.     fTime: TDateTime
  73.   end;
  74.  
  75. var
  76.   fLocks: TList;
  77.  
  78. constructor TNTKeyService.Create;
  79. begin
  80.   inherited Create;
  81.   ServiceName         := cNTServiceProg;
  82.   CanHandlePowerEvent := false;
  83.   CanPauseAndContinue := false;
  84.   CanShutdown         := true;
  85.   CanStop             := true;
  86.   EventLog.Source     := cNTServiceDisp;
  87.   EventLog.Log        := 'Application';
  88.   AutoLog := true;
  89. end;
  90.  
  91. procedure TNTKeyService.OnContinue;
  92. begin
  93.   inherited; // should never be called
  94.   //todo
  95. end;
  96.  
  97. procedure TNTKeyService.OnPause;
  98. begin
  99.   inherited; // should never be called
  100.   //todo
  101. end;
  102.  
  103. procedure TNTKeyService.OnShutdown;
  104. begin
  105.   inherited;
  106.   //todo
  107. end;
  108.  
  109. procedure TNTKeyService.OnStart(args: array of string);
  110. var
  111.   configFile: string;
  112. begin
  113.   inherited;
  114.   configFile := Paramstr(0) + '.config';
  115.   if System.IO.File.Exists(configFile) then
  116.     begin
  117.      fLocks := TList.create;
  118.       RemotingConfiguration.Configure(configFile);
  119.     end
  120.   else
  121.     raise EAbort.Create('Operation aborted');
  122. end;
  123.  
  124. procedure TNTKeyService.OnStop;
  125. begin
  126.   inherited;
  127.   if assigned(fLocks) then
  128.   begin
  129.     while (fLocks.Count > 0) do
  130.     begin
  131.       TLockItem(fLocks.items[0]).Free;
  132.       fLocks.Delete(0);
  133.     end;
  134.     fLocks.Free;
  135.   end;
  136. end;
  137.  
  138. function TLockserver.ExtendLock(const fKey: widestring): boolean;
  139. var
  140.   i: integer;
  141. begin
  142.   Result := false;
  143.   i := 0;
  144.   while (i < fLocks.Count) and (Result = false) do
  145.   begin
  146.     Result := TLockItem(fLocks.items[i]).fKey.Equals(fKey);
  147.     if Result then
  148.       TLockItem(fLocks.items[i]).fTime := System.DateTime.Now.ToOADate
  149.     else
  150.       inc(i);
  151.   end;
  152. end;
  153.  
  154. function TLockserver.Lockitem(const fItem: widestring; out fKey: widestring): boolean;
  155. var
  156.   fLockItem: TLockItem;
  157. begin
  158.   fkey := 'error';
  159.   Result := IsItemLocked(fItem);
  160.   if (Result = false) then
  161.   begin
  162.     fKey := System.Guid.Newguid.ToString;
  163.     fLockItem := TLockItem.create;
  164.     fLockItem.fItem := fItem;
  165.     fLockItem.fKey  := fKey;
  166.     fLockItem.fTime := System.DateTime.Now.ToOADate;
  167.     Result := fLocks.add(fLockItem) >= 0;
  168.   end;
  169. end;
  170.  
  171. function TLockserver.IsItemLocked(const fItem: widestring): Boolean;
  172. var
  173.   i: integer;
  174.   fExpires: double;
  175. begin
  176.   i := 0;
  177.   fExpires := System.DateTime.Now.ToOADate - FiveMin;
  178.   Result := false;
  179.   while (i < fLocks.Count) and (Result = false) do
  180.   begin
  181.     Result := TLockItem(fLocks.items[i]).fItem.Equals(fItem);
  182.     if Result then
  183.     begin
  184.       Result := TLockItem(fLocks.items[i]).fTime > fExpires; 
  185.     end;
  186.     inc(i);
  187.   end;
  188. end;
  189.  
  190. function TLockserver.UnLockitem(const fKey: widestring): boolean;
  191. var
  192.   i: integer;
  193. begin
  194.   i := 0;
  195.   Result := false;
  196.   while (i < fLocks.Count) and (Result = false) do
  197.   begin
  198.     Result := TLockItem(fLocks.items[i]).fKey.Equals(fKey);
  199.     if Result then
  200.       begin
  201.         TLockItem(fLocks.items[i]).Free;
  202.         fLocks.Delete(i);
  203.       end
  204.     else
  205.       inc(i);
  206.   end;
  207. end;
  208.  
  209. end.
  210.